iT邦幫忙

2022 iThome 鐵人賽

DAY 1
3

現代線上服務或應用程式幾乎都需要做身分驗證,因為在知道使用者是誰的前提下,才有辦法針對使用者收費,並提供更好的付費服務。當服務做得越來越大,而其他家的產品對使用者的資料有興趣想串接時,這時就會需要一個安全的身分驗證與授權機制來達成這個目標。

OAuth 2.0OpenID Connect 是目前 Web 平台上主流的身分驗證與授權的協定。包括 GoogleMicrosoft Office 365 兩個大廠都支援 OpenID Connect 協定;其他如 LINE Login 也是採用 OpenID Connect 協定,Facebook 的文件也有 OpenID Connect 協定相關的內容。

OpenID Connect 必然是經過一定程度的考驗,這些領導技術的大廠才會都採用 OpenID Connect 協定,因此我們也可以相信它的可靠度。OpenID Foundation 也有得到非常多企業的贊助與支援,這表示大多數企業也都認同他們所產出的規範,包括 OpenID Connect 協定。

現在回頭來看看自己的產品,當我們產品開始起步成長後,需求越多,系統互相串接的複雜度也會隨之提升;另一方面,使用者量成長,想破解網站的駭客也就越多。這時就可以來考慮採用 OpenID Connect 協定,來提高身分驗證與授權的安全性了。

本系列將會介紹如何使用以及導入九頭蛇--Hydra 到手上的既有系統中,讓系統可以開始支援 OpenID Connect 協定。

Hydra 是什麼?

Hydra 的全名為 ORY Hydra,是一間名為 ORY 的德國公司發布的開源套裝軟體。

一言以蔽之:Hydra 的目標是實作 OAuth 2.0 授權伺服器(Authorization Server),同時也是 OpenID Connect 服務提供者(OpenID Provider)。

以下介紹 Hydra 的幾個特色。

彈性且自由的使用者管理機制

這是 Hydra 很吸引人的特色。

Hydra 系統本身不存放使用者相關資料,如帳號密碼資訊等。它只負責控制 OpenID Connect 協定流程以及保留身分驗證和授權的記錄。這代表,使用 Hydra 不需要使用者資料庫遷移的過程,而是將 Hydra 作為一個服務串接即可。

這也正是 Hydra 設計厲害的地方--要如何存取使用者資料庫以及驗證使用者,是完全自由,可以客製化的,包括流程、實作的程式語言、或是透過其他第三方登入機制等。唯一的限制只有一個--與 OpenID Connect 協定相同,需要透過 HTTP 協定溝通。

職責單一的微服務

Hydra 使用 Golang 撰寫,功能專注於完成 OpenID Connect 協定的流程以及身分驗證和授權記錄,執行效能與記憶體使用量表現都非常好的。

Hydra 以一個可執行檔來發布,它除了可以啟動主要服務以外,也可以做為後台管理程序執行,這對開發者是非常友善的。主要服務與指令程式,透過 Golang 打包成單一執行檔,可以各個主流平台上執行,如 Mac、Windows 等,當然也包括 Docker,這對維運人員也是非常友善的。

Hydra 軟體架構設計符合 The Twelve-Factor App 所提到的要素,因此在遷移服務、水平擴展、甚至是直上 K8S 都是容易的。

資訊安全優先

實作能夠掌控存取行為的授權伺服器或是 OpenID Connect 服務提供者時,資安考量是非常重要的。Hydra 在設計的時候,預設已有考慮過嚴謹的安全性。

Hydra 的安全架構有依據 RFC 6819 - OAuth 2.0 Threat Model and Security Consideration,也就是針對 OAuth 2.0 協定各種可能的風險提出其他安全注意事項,來做更嚴密的防護,如:OpenID Connect Core 1.0 - 3.1.2.1. Authentication Request 裡提到 state 參數,定義是 RECOMMENDED。但 RFC 6819 裡面有提到可以應用 state 來提高安全性,因此Hydra 設計是 REQUIRED,如果沒有帶 state 參數的話會拒絕請求。

OpenID 官方認證

最後,Hydra 通過了 OpenID 官方認證,因此協定的相容性是可以信任的。有通過認證是非常重要的參考依據,這表示串接服務遇到的問題會相較少很多。比方說,筆者使用了一樣是 OpenID 官方認證的 openid-client 套件,串接過程都非常順利,照著套件說明書一步步填上必要的參數,程式執行後即可完成串接。

順帶一提的是,通過官方認證的列表裡,可以看到有幾家知名大廠,如 Google、Microsoft 還有 LINE Login,包括筆者接觸過的另一套 WSO2 Identity Server 也在裡面。而 AppleID 雖然也有做出類似 OpenID Connect 的流程,但不在列表裡,這是因為 AppleID 實作不符合協定要求,因此就沒有成功完成官方認證了。


本系列文章將會介紹以下內容:

  1. 使用 Hydra 目前最新版 1.11.10 為範例,實作 OpenID Connect 服務提供者。
  2. PHP 8.1 + Composer 2 + Laravel 9 的程式開發(Laravel 深度了解可參考 Laravel 原始碼分析 系列文章)
  3. 應用 Docker 建置測試環境(Docker 初學者可參考 30 天與鯨魚先生做好朋友 系列文章)
  4. 部分 Hydra 原始碼追蹤(Golang 初學者可參考 從無到有,使用 Go 開發應用程式 系列)

參考資料

開放標準參考附表

Hydra 原始碼的說明文件有提到,Hydra 實作了 IETF 發布與 OAuth 2.0 相關的標準:

另外也實作了 OpenID Foundation 所提的協定:


下一篇
OAuth 2.0 協定簡介
系列文
30 天與九頭蛇先生做好朋友23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
雷N
iT邦研究生 1 級 ‧ 2022-09-16 23:30:32

/images/emoticon/emoticon28.gif
Day1 我就感受到一堆生番

0
json_liang
iT邦研究生 4 級 ‧ 2022-09-17 00:11:54

Hydra 萬歲

0
雷N
iT邦研究生 1 級 ‧ 2022-09-28 17:27:05

https://ithelp.ithome.com.tw/upload/images/20220928/20104930SgTMGF9YgE.jpg

我要留言

立即登入留言